package com.demo.money.config;

import com.demo.money.inteceptor.IpInteceptor;
import com.demo.money.inteceptor.MyInteceptor;
import com.demo.money.service.IpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * WebMvcConfig类<br>
 * SpringMVC组件管理,定义回调方法，为通过EnableWebMvc启用的Spring MVC自定义基于Java的配置。<br>
 * EnableWebMvc带注释的配置类可以实现此接口，以便回调，并提供自定义默认配置的机会。
 * <p>
 * 常用方法：<br>
 * 1.addInterceptors：拦截器<br>
 * 2.addViewControllers：页面跳转<br>
 * 3.addResourceHandlers：静态资源<br>
 * 4.configureDefaultServletHandling：默认静态资源处理器<br>
 * 5.configureViewResolvers：视图解析器<br>
 * 6.configureContentNegotiation：配置内容裁决的一些参数<br>
 * 7.addCorsMappings：跨域<br>
 * 8.configureMessageConverters：信息转换器<br>
 *
 * <p>
 * 全类名:com.example.demo1.config<br>
 * 类名:WebMvcConfig<br>
 * 创建者:张峰浦<br>
 * 创建时间:2020/3/11 21:41<br>
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 页面跳转<br>
     * 在这里重写addViewControllers方法，并不会覆盖WebMvcAutoConfiguration（Springboot自动配置）<br>
     * 配置预先配置了响应状态代码和/或视图的简单自动控制器，以呈现响应体。<br>
     * 这在不需要自定义控制器逻辑的情况下非常有用，<br>
     * 例如呈现主页、执行简单的站点URL重定向、返回包含HTML内容的404状态、返回不包含内容的204状态等等。<br>
     * <p>
     * 重定向到请求 - registry.addRedirectViewController("/","login");<br>
     * 转发到请求 - registry.addViewController("/").setViewName("index/login");
     *
     * @param registry 协助注册预先配置有状态代码和/或视图的简单自动控制器。
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //默认转发到登录页面
        registry.addViewController("/").setViewName("index/login");
        //registry.addViewController("/error").setViewName("index/error.html");
    }

    @Autowired
    private IpService ipService;

    /**
     * <b>addInterceptors：拦截器</b>
     * <p>
     * 为控制器方法调用和资源处理程序请求的前处理和后处理添加Spring MVC生命周期拦截器。<br>
     * 拦截器可以注册为应用于所有请求，也可以限制为URL模式的子集。
     * <p>
     * 1.addInterceptor：需要一个实现HandlerInterceptor接口的拦截器实例<br>
     * 2.addPathPatterns：用于设置拦截器的过滤路径规则；addPathPatterns("/**")对所有请求都拦截<br>
     * 3.excludePathPatterns：用于设置不需要拦截的过滤规则
     * <p>
     * 拦截器主要用途：进行用户登录状态的拦截，日志的拦截等。<br>
     *
     * @param registry 协助注册预先配置有状态代码和/或视图的简单自动控制器。
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 设置拦截器的过滤路径规则-listAddPathPatterns
        List<String> listAddPathPatterns = new ArrayList<String>();
//        listAddPathPatterns.add("/dashboard");
//        listAddPathPatterns.add("/dashboard.html");
        listAddPathPatterns.add("/**");
        //设置不需要拦截的过滤规则
        List<String> listExcludePathPatterns = new ArrayList<String>();
        listExcludePathPatterns.add("/login");
        listExcludePathPatterns.add("/login01");
        listExcludePathPatterns.add("/login.html");
        listExcludePathPatterns.add("/");
        listExcludePathPatterns.add("/user-landingVerification");
        listExcludePathPatterns.add("/user-landingVerification.html");

        listExcludePathPatterns.add("/css/**");
        listExcludePathPatterns.add("/fonts/**");
        listExcludePathPatterns.add("/images/**");
        listExcludePathPatterns.add("/js/**");
        listExcludePathPatterns.add("/lib/**");

        listExcludePathPatterns.add("/news/**");
        listExcludePathPatterns.add("/type/**");
        //实现HandlerInterceptor接口的拦截器实例
        registry.addInterceptor(new MyInteceptor()).addPathPatterns(listAddPathPatterns).excludePathPatterns(listExcludePathPatterns);

        List<String> listIpInteceptor = new ArrayList<String>();
        listIpInteceptor.add("/**");
        List<String> listIpInteceptorExclude = new ArrayList<String>();
        listIpInteceptorExclude.add("/css/**");
        listIpInteceptorExclude.add("/fonts/**");
        listIpInteceptorExclude.add("/images/**");
        listIpInteceptorExclude.add("/js/**");
        listIpInteceptorExclude.add("/lib/**");
        registry.addInterceptor(new IpInteceptor(ipService)).addPathPatterns(listIpInteceptor).excludePathPatterns(listIpInteceptorExclude);

    }

    /**
     * Add handlers to serve static resources such as images, js, and, css
     * files from specific locations under web application root, the classpath,
     * and others.
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将所有/static/** 访问都映射到classpath:/static/ 目录下
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");

    }
}
